ECS でタスクを手動停止してもイメージが更新されない事象を回避するには

ECS でタスクを手動停止してもイメージが更新されない事象を回避するには

Clock Icon2024.07.09

困っていた内容

latestのイメージタグを設定したタスク定義を利用して、ECS サービスでコンテナを実行しています。
イメージ更新の場合は、コンテナレジストリのlatestイメージを更新してタスクを手動停止しています。
先日、手動停止したところ代替として起動したタスクのイメージは更新されていませんでした。
なぜでしょうか。対処方法を教えてください。

どう対応すればいいの?

「新しいデプロイの強制」を選択した状態で、ECS サービスを更新してください。

https://dev.classmethod.jp/articles/tsnote-ECS-Service-Force-new-deployment/

ECS サービスでは、サービス内のタスクが使用するイメージの一貫性を保つため、タグをダイジェストに解決し、起動するタスクに使用する仕様になりました。
そのため ECS サービスでデプロイ後に、イメージタグが参照するイメージを変更し、新たにタスクを起動した場合も、タスクはデプロイ時のイメージを参照します。

Amazon ECS でコンテナ化されたアプリケーションにソフトウェアバージョンの一貫性が強制されるように - AWS

Amazon ECS は、Amazon ECS サービスに更新をデプロイするときに、コンテナイメージタグをイメージダイジェスト (イメージマニフェストの SHA256 ハッシュ) に解決し、サービス内のすべてのタスクが同一であることと、このイメージダイジェストで起動することを強制するようになりました。つまり、タスク定義で「LATEST」などのミュータブルなイメージタグを使用し、デプロイ後にサービスがスケールアウトされた場合でも、新しいタスクの起動には正しいイメージ (サービスのデプロイ時に使用されたもの) が使用されます。

タスクが使用するイメージを更新したい場合は、タスクを個別に手動停止するのではなく「新しいデプロイの強制」を選択した状態で ECS サービスを更新してください。

参考資料

タスクを置き換えて Amazon ECS サービスをデプロイする - Amazon Elastic Container Service

コンテナイメージダイジェストが確立されると、Amazon ECS はこのダイジェストを、他の対象タスクの開始や、その後のサービスの更新に使用します。この結果、サービス内のすべてのタスクで常に同じコンテナイメージが実行され、ソフトウェアのバージョン整合性が得られます。

Deploy Amazon ECS services by replacing tasks - Amazon Elastic Container Service

To establish an updated image digest, you can force a new deployment. This updated digest will be used to start new tasks and will not affect already running tasks.

Amazon ECS におけるソフトウェアバージョンの一貫性の実現 | Amazon Web Services ブログ

ECS デプロイメントコントローラー (ローリングアップデート) を使用する ECS サービスは、タスク定義リビジョンがコンテナイメージタグを参照していても、デプロイメントライフサイクル全体で同一のコンテナイメージダイジェストを使用することが保証されます。Amazon ECS は、最初のタスクのデプロイ時にコンテナランタイムがイメージタグを解決する際、イメージダイジェストを保存しておきます。そして、そのデプロイメントにおける他のすべてのタスクは、保存したイメージダイジェストを参照する形になります。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.